<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>

</body>
<script>
  // 继承   让一个类(构造函数)  继承 另一个类(构造函数)  的 属性和方法(实例的相关属性和方法 以及 原型对象上相关属性和方法)  或者重新定义、追加属性和方法等。
  // 被继承的类 父类
  // 继承的类   子类

  // 目的:  实现属性和方法的复用

  // 构造函数继承:  实现父类实例的相关属性和方法的继承
  // 通过调用父类构造函数  => 强制将this指向 当前子类构造函数在执行过程中 创建的实例化对象
  // Person.call(this,name,age); 

  // 缺点 => 只 继承了 父类实例的相关属性和方法   原型对象上的属性和方法没有继承




  function Person(name, age) {
    // this -> 构造函数Person在执行过程中 创建的实例化对象
    this.name = name;
    this.age = age;
  }

  Person.prototype.species = "human";
  Person.prototype.skill = function () {
    console.log("thinking");
  }
  Person.prototype.say = function () {
    console.log(this.name, this.age);
  }


  function YellowPerson(name, age, hobby) {
    // this -> 构造函数YellowPerson在执行过程中 创建的实例化对象
    // this.name = name;
    // this.age = age;

    // Person();    this => window

    // 调用父类构造函数 强制将this指向 当前YellowPerson在执行过程中 创建的实例化对象
    Person.call(this, name, age);

    this.hobby = hobby;
  }

  // YellowPerson.prototype.species = "human";
  // YellowPerson.prototype.skill = function(){
  //     console.log("thinking");
  // }
  // YellowPerson.prototype.say = function(){
  //     console.log(this.name,this.age);
  // }

  YellowPerson.prototype.say = function () {
    console.log(this.name, this.age, this.hobby);
  }
  YellowPerson.prototype.speak = function () {
    console.log("chinese");
  }

  var yp = new YellowPerson("张三", 18, "唱歌");
  console.log(yp);







</script>

</html>